//
//  StatusListViewModel.swift
//  weibo
//
//  Created by 张宏芝 on 15/9/5.
//  Copyright © 2015年 kama. All rights reserved.
//

import UIKit
import ReactiveCocoa
import SDWebImage

/// 微博列表的视图模型:分离网络方法
class StatusListViewModel: NSObject {

//    微博数据数组
    lazy  var statuses:[AnyObject] = [StatusViewModel]()
    
//    加载微博数据
//        判断是不是进行上拉操作
        func loadStatuses(isPullupRefresh isPullupRefresh: Bool) -> RACSignal {
            
            // 初始刷新: statuses 数组没有内容
            // 下拉刷新: 取 statuses 的第一项的 id 作为 since_id
            var since_id = (statuses.count ?? 0) == 0 ? 0 : (statuses.first as! StatusViewModel).status.id
            var max_id = 0
            // 上拉刷新: 取 statuses 的最后一项的 id 作为 max_id
            if isPullupRefresh {
                since_id = 0
                max_id = (statuses.last as! StatusViewModel).status.id
            }

        
        return RACSignal.createSignal({[weak self] (subscriber) -> RACDisposable! in
            
            NetWorkTools.sharedTools.loadStatus(since_id: since_id, max_id: max_id).subscribeNext({ (result) -> Void in
        
//                1.获取result中得statuses字典数组
                guard let array = result["statuses"] as? [[String:AnyObject]] else{
                     printLog("没有正确的数据")
                    subscriber.sendError(NSError(domain: "com.kama.error", code: -1002, userInfo: ["error message":"没有正确数据"]))
                    return
                }
////               2.字典转模型
//                定义并创建一个临时数组,记录当前网络请求返回的结果
                var arrayM = [AnyObject]()
//                遍历数组,字典转模型
                for dict in array{
                    arrayM.append(StatusViewModel(status: Status(dict: dict)))
                }
                
                 printLog("刷新到 \(arrayM.count) 条微博")
                
                // 添加尾随闭包
                self?.cacheWebImage(arrayM as! [StatusViewModel]) {
                    
                    if max_id > 0 {     // 将新数据拼接在现有数组的末尾
                        self?.statuses += arrayM
                    } else {            // 初始刷新&下拉刷新
                        self?.statuses = arrayM + self!.statuses
                    }
                    
                    
                    if since_id > 0{
                        subscriber.sendNext(arrayM.count)
                    }
                    
                    // 3. 通知调用方数据加载完成
                    subscriber.sendCompleted()
                }
                
                }, error: { (error) -> Void in
                    
                    subscriber.sendError(error)
                }) {}
            
            return nil
            })
        }


//    一张图片的情况:将图片首先缓存到本地,在进行显示(运用调度组的方法)
    private func cacheWebImage(array:[StatusViewModel],finished:() ->()){
        
//1.定义调度组
        let group = dispatch_group_create()
//        记录图像的大小
        var dataLength = 0
        for viewModel in array{
            let count = viewModel.thumbnailURLs?.count ?? 0
//            目标:只需要缓存单张的图片
            if count != 1{
                continue
            }
            printLog(viewModel.thumbnailURLs)

//2.入组:紧贴block/闭包,enter/leave 成对出现
            dispatch_group_enter(group)
//            数量小的时候使用
            SDWebImageManager.sharedManager().downloadImageWithURL(viewModel.thumbnailURLs![0], options: [], progress: nil, completed: { (image, _, _, _, _) -> Void in
                if image != nil{
//                    将image转换为二进制数据
                    let data = UIImagePNGRepresentation(image)
                    dataLength += data?.length ?? 0
                }
//.出组
                dispatch_group_leave(group)
            })
        }
        dispatch_group_notify(group,dispatch_get_main_queue()){
            printLog("图片缓存完成,缓存了\(dataLength / 1024)k")
            finished()
        }
        
    }
}





























